package com.controller;

import com.context.conexion.EnahoConexion;
import util.controller.Vista;
import com.controller.http.SesionEnaho;
import com.model.domain.equipo.DispositivoMovil;
import com.model.domain.equipo.ModeloDispositivoMovil;
import com.model.domain.persona.Cargo;
import com.model.domain.persona.CondicionNivelEducativo;
import com.model.domain.persona.CursoEstudiado;
import com.model.domain.persona.EstadoCivil;
import com.model.domain.persona.FiltroPersonal;
import com.model.domain.persona.LenguaMaterna;
import com.model.domain.persona.NivelEducativo;
import com.model.domain.persona.Personal;
import com.model.domain.persona.ProblemaSalud;
import com.model.domain.persona.SeguroPensiones;
import com.model.domain.persona.Sexo;
import com.model.domain.persona.TallaRopa;
import util.reporte.Pagina;
import com.model.domain.ubicacion.Departamento;
import com.model.domain.ubicacion.Distrito;
import com.model.domain.ubicacion.Odei;
import com.model.domain.ubicacion.Provincia;
import com.model.domain.usuario.Perfil;
import com.model.domain.usuario.PerfilEnum;
import com.model.domain.usuario.Usuario;
import util.usuario.seguridad.PermisosTabla;
import com.model.service.PersonalService;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import util.date.DateUtil;
import util.encrypt.apache_commons.CriptoTripleDES;
import util.excel.RegistroExcel;
import util.file.xml.XmlUtil;
import util.file.xml.ArchivoXml;
import util.log.MiLoggerFile;
import util.www.http.Request;

/**
 *
 * @author rdelacruz
 */
public class PersonalController 
extends AbstractController
{            
    
    private MiLoggerFile loggerErrores;
    
    public void verComboOdei(Vista v, HttpServletRequest request, HttpServletResponse response) throws Exception {
        Connection con =null;
        try {
            con = EnahoConexion.getConexion();
            PersonalService service = (PersonalService)this.getService();
            List<Odei> odeis = service.getOdeiService().findByCodigoDepartamento(con,request.getParameter("dpto"));
            
            Odei odei = new Odei();
            odei.setCodigo(request.getParameter("odei"));
            Personal comando = new Personal();
            comando.setOdei(odei);
            
            request.setAttribute("disabled", request.getParameter("disabled"));
            request.setAttribute("comando", comando);
            request.setAttribute("odeis", odeis);
        }
        finally {
            if(con!=null) con.close();
        }        
        v.setUrl("pagweb/personal/mnto_personal_comboOdei.jsp");
    }
    
    public void verDescargaArchivos(Vista vista, HttpServletRequest request, HttpServletResponse response) throws Exception {
        //request.setAttribute("query", query);        
        vista.setUrl("pagweb/personal/descarga_archivos.jsp");
    }
    
    public void descargarArchivoExcel(Vista vista, HttpServletRequest request, HttpServletResponse response) throws Exception {
        Connection con = null;        
        try {
            con = EnahoConexion.getConexion();
            PersonalService service = (PersonalService)this.getService();
            List<RegistroExcel> lista = service.findRegistrosParaExportarExcel(con);
            request.setAttribute("lista", lista);
        } finally {
            if(con!=null) con.close();
        }
        vista.setUrl("pagweb/personal/archivo_excel.jsp");
    }
    
    public void descargarArchivoXml(Vista vista, HttpServletRequest request, HttpServletResponse response) throws Exception {
        Connection con =null;
        try {
            con = EnahoConexion.getConexion();

            PersonalService service = (PersonalService)this.getService();
            List<Personal> listaPersonal = service.findParaExportarPDA(con);
            List<Cargo> listaCargo = service.getCargoService().findParaExportar(con);
            List<Odei> listaOdei = service.getOdeiService().findParaExportar(con);

            ArchivoXml xml = new ArchivoXml();
            Document doc = xml.getDocument();
            
            //Contruyendo el Document
            Element raiz = doc.createElement("xml");
            doc.appendChild(raiz);
            
            
            Element elemento;
            elemento = doc.createElement("Personal");
            raiz.appendChild(elemento);                
            for(Personal p : listaPersonal) {
                Element reg = doc.createElement("Registro");
                elemento.appendChild(reg);
                
                XmlUtil.agregarNodoTexto(doc, reg, "P_CodPer", p.getDni());
                XmlUtil.agregarNodoTexto(doc, reg, "P_Nombre", p.getNombres());
                XmlUtil.agregarNodoTexto(doc, reg, "P_ApePaterno", p.getApellidoPaterno());
                XmlUtil.agregarNodoTexto(doc, reg, "P_ApeMaterno", p.getApellidoMaterno());
                XmlUtil.agregarNodoTexto(doc, reg, "P_Cargo", p.getCargo().getCodigo());
                XmlUtil.agregarNodoTexto(doc, reg, "P_Odei", p.getOdei().getCodigo());
                XmlUtil.agregarNodoTexto(doc, reg, "P_Dpto", p.getOdei().getDepartamento().getCodigo());
                XmlUtil.agregarNodoTexto(doc, reg, "P_Usuario", p.getUsuario().getIdentificador());
                XmlUtil.agregarNodoTexto(doc, reg, "P_Clave", p.getUsuario().getClave());                
                XmlUtil.agregarNodoTexto(doc, reg, "P_FechaNac", p.getFechaNacimiento());
            }
            
           
            elemento = doc.createElement("Cargo");
            raiz.appendChild(elemento);                
            for(Cargo c : listaCargo) {                                      
                Element reg = doc.createElement("Registro");
                elemento.appendChild(reg);
                
                XmlUtil.agregarNodoTexto(doc, reg, "CodCargo", c.getCodigo());
                XmlUtil.agregarNodoTexto(doc, reg, "DesCargo", c.getNombre());
            }
            
            elemento = doc.createElement("Odei");
            raiz.appendChild(elemento);                
            for(Odei od : listaOdei) {
                Element reg = doc.createElement("Registro");
                elemento.appendChild(reg);
                
                XmlUtil.agregarNodoTexto(doc, reg, "CodOdei", od.getCodigo());
                XmlUtil.agregarNodoTexto(doc, reg, "NomOdei", od.getNombre());
            }
           
            
            //response.setContentType("application/force-download");
            //response.setContentType("application/txt");
            //response.setHeader("Content-type","application/xml");
            response.setContentType("application/force-download");
            String archivo = "Personal_xml_"+DateUtil.getFechaActualString("dd-MM-yyyy_HH-mm");//le quité la extension xml porque sino, IE no lo puede descargar
            response.setHeader("Content-Disposition","attachement; filename="+archivo);
            
            String data;            
            data = xml.getDataXmlCompacta();            
            //data = xml.getDataXml(CodificacionTexto.ISO_8859_1);            
            
            CriptoTripleDES cripto = new CriptoTripleDES("AG30GZKCEC5j5TD");//15 LETRAS
            data = cripto.encrypt(data);
            
            response.getWriter().write(data);
            
            //NOTA: "ISO-8859-1" sirve para leer el XML en Internet Explorer. No usarlo para el archivo exportado
            //response.getWriter().write("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>"+xml.getDataXmlCompacta());
            //response.getWriter().append(xml.getDataXml());

            //Otra forma más informal:
            //request.setAttribute("lista", lista);
            //vista.setUrl("pagweb/personal/xml.jsp");
        }
        finally {
            if(con!=null) con.close();
        }
        //this.verDescargaArchivos(vista, request, response);
    }
          
    
    private FiltroPersonal setearFiltro(HttpServletRequest request) {
        Request r = new Request(request);
        
        
        FiltroPersonal filtro = new FiltroPersonal();        
        Pagina pag = new Pagina();        
        filtro.setPagina(pag);        
        pag.setNumero(r.getInt("hdnPagmos")); 
        pag.setTamanho(r.getInt("cbopagsize"));                 
        filtro.setTipo(r.getString("cbobuspor"));
        filtro.setTexto(r.getString("txtbuspor"));
        Odei odei = new Odei();
        odei.setCodigo(r.getString("cbobusporOdei"));
        filtro.setOdei(odei);
                
        //request.setAttribute("accion", "");
        request.setAttribute("filtro", filtro);
        
        return filtro;
    }
     
    public void verMantenimiento(Vista vista, HttpServletRequest request, HttpServletResponse response) throws Exception {
        
        String query = request.getParameter("query");        
        if(query==null) {
            query = request.getQueryString();
        }
        
        request.setAttribute("query", query);
        
        
        Connection con = null;        
        try {
            con = EnahoConexion.getConexion();
            PersonalService service = (PersonalService)this.getService();
            request.setAttribute("odeis", service.getOdeiService().findAll(con));
        } finally {
            if(con!=null) con.close();
        }  
        
        //response.sendRedirect(MANTENIMIENTO);       
        vista.setUrl("pagweb/personal/mnto_personal.jsp");
    }
    
    public void buscar(Vista vista, HttpServletRequest request, HttpServletResponse response) throws Exception {
        FiltroPersonal filtro = this.setearFiltro(request);
        
        Connection con = null;        
        try {
            con = EnahoConexion.getConexion();
            PersonalService service = (PersonalService)this.getService();
            request.setAttribute("lista", service.findByFilter(con,filtro));
        } finally {
            if(con!=null) con.close();
        }        
                
        verMantenimiento(vista,request,response);        
        
        request.setAttribute("query", request.getQueryString());
        request.setAttribute("filtro", filtro);
    }
      
       
    public void nuevo(Vista vista, HttpServletRequest request, HttpServletResponse response) throws Exception {       
        Connection con = null;
        try {
            con = EnahoConexion.getConexion();
            setearModeloEdicion(con,request);            
            
            PersonalService service = (PersonalService) this.getService();
            SesionEnaho ses = new SesionEnaho(request);
            Usuario uSesion = ses.getUsuario();
            PermisosTabla permisos = uSesion.getPermisosTabla();
            
            String[] valores = permisos.getValoresPermitidosParaInsertarColumna("perfil");
            List<Perfil> perfiles = service.getPerfilService().findByCodigos(con,valores);
            
            valores = permisos.getValoresPermitidosParaInsertarColumna("dpto");
            List<Departamento> departamentos = service.getDepartamentoService().findByCodigos(con,valores);            
            request.setAttribute("departamentos", departamentos);
            request.setAttribute("accion", "N");
            request.setAttribute("perfiles", perfiles);
            
            //VALORES POR DEFECTO
            Personal p = new Personal();
            Usuario u = new Usuario();
            p.setUsuario(u);
            u.setActivo(Boolean.TRUE);
            
            if(uSesion.getPerfil().getEnum()==PerfilEnum.ADMINISTRADOR_CAMPO) {
                Cargo c = new Cargo();
                c.setCodigo("04");
                p.setCargo(c);
            }
            
            if(departamentos.size()==1) {                
                p.setOdei(uSesion.getPersonal().getOdei());
            }
            
            if(perfiles.size()==1) {
                u.setPerfil(perfiles.get(0));
            }
            
            request.setAttribute("comando", p);
        }
        finally {
            if(con!=null) con.close();
        }        
        verMantenimiento(vista,request,response);
    }
    
    public void modificar(Vista vista, HttpServletRequest request, HttpServletResponse response) throws Exception {
        Connection con = null;
        try {
            con = EnahoConexion.getConexion();
            setearModeloEdicion(con,request);   
            
            PersonalService service = (PersonalService) this.getService();
            SesionEnaho ses = new SesionEnaho(request);
            PermisosTabla permisos = ses.getUsuario().getPermisosTabla();
            
            //List<Perfil> perfiles = service.getPerfilService().findAll(con);
            String[] valores = permisos.getValoresPermitidosParaActualizarColumna("perfil");
            List<Perfil> perfiles = service.getPerfilService().findByCodigos(con,valores);                        
            
            List<Departamento> departamentos = service.getDepartamentoService().findAll(con);
            
            request.setAttribute("departamentos", departamentos);
            request.setAttribute("accion", "M");
            request.setAttribute("perfiles", perfiles);
            
            String dni = request.getParameter("hdnDni");
            Personal p = service.findByDni(con, dni);
            request.setAttribute("comando", p);
        }
        finally {
            if(con!=null) con.close();
        }
        
        verMantenimiento(vista,request,response);
    }    
    
    public void guardar(Vista vista, HttpServletRequest request, HttpServletResponse response) throws Exception {        
        Personal comando = new Personal();
        setearComando(comando,request);    
        PersonalService service = (PersonalService) this.getService();
        
        String mensaje = "<B>Datos guardados correctamente.</B>";
        
        Connection con = null;
        try {
            con = EnahoConexion.getConexion();
            if(service.existeUsuario(con, comando.getUsuario().getIdentificador())) {
                mensaje = "<font color='red'>Usuario " + comando.getUsuario().getIdentificador() + " ya existe.</font>";
            }
            else {
                SesionEnaho ses = new SesionEnaho(request);
                service.guardar(con,comando, ses.getUsuario());
            }
        }
        finally {
            if(con!=null) con.close();
        }
        
        request.setAttribute("mensaje", mensaje);
        
        this.verMantenimiento(vista,request, response);
        //this.buscar(vista,request, response);
    }
    
    
    
    public void actualizar(Vista vista, HttpServletRequest request, HttpServletResponse response) throws Exception {
        Personal comando = new Personal();
        setearComando(comando,request);    
        PersonalService service = (PersonalService) this.getService();
                
        String mensaje = "<B>Datos guardados correctamente.</B>";
        
        Connection con = null;
        try {
            con = EnahoConexion.getConexion();
            SesionEnaho ses = new SesionEnaho(request);
            service.actualizar(con,comando,ses.getUsuario());
        }
        catch(Exception ex) {
            mensaje = "<font color='red'>Error al actualizar datos de " + comando.getUsuario().getIdentificador() + "</font>";
            //ex.printStackTrace();
            loggerErrores.loge(ex);
        }
        finally {
            if(con!=null) con.close();
        }
        
        request.setAttribute("mensaje", mensaje);
        this.verMantenimiento(vista,request, response);
        //this.buscar(vista,request, response);
    }
    
    public void eliminar(Vista vista, HttpServletRequest request, HttpServletResponse response) throws Exception {
        PersonalService service = (PersonalService) this.getService();
                
        String mensaje = "Usuario eliminado correctamente.";        
        Personal p = null;
        
        Connection con = null;
        try {
            con = EnahoConexion.getConexion();
            String dni = request.getParameter("hdnDni");
            p = service.findByDni(con, dni);
            if(p==null) {
                mensaje = "<font color='red'>Usuario " + p.getUsuario().getIdentificador() + " no existe.</font>";
            }
            else {
                service.eliminar(con,p);
            }
        }
        catch(Exception ex) {
            if(p!=null) {
                mensaje = "<font color='red'>No se puede eliminar usuario " + p.getUsuario().getIdentificador();
                mensaje = mensaje + ". Ya tiene movimientos registrados.</font>";
            }
        }
        finally {
            if(con!=null) con.close();
        }
        
        request.setAttribute("mensaje", mensaje);
        this.verMantenimiento(vista,request, response);
    }
    
    public void cancelar(Vista vista, HttpServletRequest request, HttpServletResponse response) throws Exception {
        //buscar(vista,request,response);
        verMantenimiento(vista,request,response);
    }
    
    private void setearModeloEdicion(Connection con, HttpServletRequest request) throws Exception {
        PersonalService service = (PersonalService) this.getService();
             
        List<EstadoCivil> estadosCiviles = service.getEstadoCivilService().findAll(con);
        List<Cargo> cargos = service.getCargoService().findAll(con);
        //List<Departamento> departamentos = service.getDepartamentoService().findAll(con);
        
        //List<Odei> odeis = service.getOdeiService().findAll(con);        
        request.setAttribute("estadosCiviles", estadosCiviles);
        request.setAttribute("cargos", cargos);
        //request.setAttribute("departamentos", departamentos);
        //request.setAttribute("odeis", odeis);
        request.setAttribute("sexos", Sexo.values());
        
        request.setAttribute("lenguasMaternas", service.getLenguaMaternaService().findAll());        
        request.setAttribute("tallas", TallaRopa.values());
        request.setAttribute("nivelesEducativos", NivelEducativo.values());
        request.setAttribute("condicionesNivelEducativo", CondicionNivelEducativo.values());
        request.setAttribute("problemasSalud", ProblemaSalud.values() );
        request.setAttribute("segurosPensiones", SeguroPensiones.values() );
        
    }
    
    private void setearComando(Personal comando, HttpServletRequest request) {
        Request r = new Request(request);       
        comando.setDni(r.getString("txtDNI"));
        comando.setApellidoPaterno(r.getString("txt_apepat"));
        comando.setApellidoMaterno(r.getString("txt_apemat"));
        comando.setNombres(r.getString("txtnom"));
        comando.setFechaNacimiento(r.getString("txtfec_nac"));
        comando.setLugarNacimiento(r.getString("txtLugarNac"));//N
        
        String sex = r.getString("cbosexo");
        if(sex!=null && !sex.isEmpty())
            comando.setSexo(Sexo.valueOf(sex));//combo sexo
        
        EstadoCivil ec = new EstadoCivil();
        //ec.setCodigo(r.getInteger("cboest_civ"));
        ec.setCodigo(r.getString("cboest_civ"));
        comando.setEstadoCivil(ec);
        
        Cargo c = new Cargo();
        c.setCodigo(r.getString("cbocargo"));
        comando.setCargo(c);
        
        Departamento dpto = new Departamento();
        dpto.setCodigo(r.getString("cbodpto"));
                
        Odei odei = new Odei();
        odei.setDepartamento(dpto);
        odei.setCodigo(r.getString("cboodei"));
        comando.setOdei(odei);        
        
        Provincia prov = new Provincia();
        prov.setCodigo(r.getString("cboProvincia"));//N
        
        Distrito dist = new Distrito();
        dist.setProvincia(prov);
        dist.setCodigo(r.getString("cboDistrito"));//N
        comando.setDistrito(dist);
        
        comando.setDireccion(r.getString("txtdireccion"));
        comando.setTelefono(r.getString("txttelefono"));
        comando.setTelefonoCelular(r.getString("txtcelular"));//N
        comando.setProfesion(r.getString("txtprofesion"));
        comando.setCorreo(r.getString("txtcorreo"));
        
        comando.setNroHijos(r.getInt("txtNroHijos"));//N
        comando.setNroHijosMenor1(r.getInt("nroHijosMenor1"));//N
        comando.setNroHijosEntre6_12(r.getInt("nroHijosEntre6_12"));//N
        comando.setNroHijosEntre1_2(r.getInt("nroHijosEntre1_2"));//N
        comando.setNroHijosEntre13_17(r.getInt("nroHijosEntre13_17"));//N
        comando.setNroHijosEntre3_5(r.getInt("nroHijosEntre3_5"));//N
        comando.setNroHijosMayor18(r.getInt("nroHijosMayor18"));//N

        comando.setGrupoSanguineo(r.getString("grupoSanguineo"));//N
        comando.setPeso(r.getBigDecimal("peso"));//N
        comando.setEstatura(r.getBigDecimal("estatura"));//N
        
        LenguaMaterna leng = new LenguaMaterna();
        leng.setCodigo(r.getString("cboLenguaMaterna"));//N
        comando.setLenguaMaterna(leng);
        comando.setOtraLenguaMaterna(r.getString("txtOtraLenguaMaterna"));//N
        
        
        Usuario u = new Usuario();
        
        Perfil pf = new Perfil();
        pf.setCodigo(r.getString("cboperfil"));
        u.setPerfil(pf);
        
        u.setIdentificador(r.getString("txtcod_usuario"));
        
        u.setClave(r.getString("txtpassword"));
        
        u.setActivo(r.getBoolean("cboestado","0"));   
        
        DispositivoMovil d = new DispositivoMovil();
        comando.setMovil(d);
        
        ModeloDispositivoMovil mod = new ModeloDispositivoMovil();
        d.setModelo(mod);
        mod.setCodigo(r.getString("cbotipoMovil"));
        
        d.setCodigoPatrimonial(r.getString("txtcod_patrimonial"));
        
        comando.setAccesoMovil(r.getBoolean("chkmovil",null));
        comando.setAccesoPBasico(r.getBoolean("chkpbasico",null));
        comando.setAccesoPFinal(r.getBoolean("chkpfinal",null));
        
        u.setFechaAlta(r.getString("txtfec_alta"));
        u.setFechaBaja(r.getString("txtfec_baja"));
        
        comando.setUsuario(u);
        
        //NUEVOS:
        comando.setTallaChaleco(r.getEnum(TallaRopa.class,"chaleco"));//N
        comando.setTallaPolo(r.getEnum(TallaRopa.class,"polo"));//N
        
        comando.setNivelEducativo(r.getEnum(NivelEducativo.class,"cboNivelEducativo"));//N
        comando.setCondicionNivelEducativo(r.getEnum(CondicionNivelEducativo.class,"cboCondicionNivelEducativo"));//N
        
        comando.setCarrera(r.getString("carrera"));
        comando.setCentroEstudios(r.getString("centroEstudios"));
        
        comando.setAñoInicioEstudio(r.getString("estudiosInicio"));
        comando.setAñoFinalEstudio(r.getString("estudiosFin"));
        
        comando.setFechaObtencionGrado(r.getString("fechaObtencionGrado"));
        
        comando.setTieneEstudiosComputacion(r.getBoolean("estudiosComputacion"));
                
        List<CursoEstudiado> cursos = new ArrayList<CursoEstudiado>();
        for(int i=1; i<=CursoEstudiado.NRO_MAX_CURSOS; i++) {            
            CursoEstudiado curso  = new CursoEstudiado();
            curso.setNombre(r.getString("curso"+i));
            curso.setAnho(r.getString("anho"+i));
            curso.setDuracionMeses(r.getInteger("meses"+i));
            
            curso.setNumero(i);
            curso.setPersonal(comando);
            cursos.add(curso);
        }
        comando.setCursosLlevados(cursos);
        
        comando.setAñosExperienciaEnaho(r.getInteger("anhosExperiencia"));
        comando.setMesesExperienciaEnaho(r.getInteger("mesesExperiencia"));
        
        comando.setTuvoOtraExperienciaLaboral(r.getBoolean("tuvoOtraExperienciaLaboral"));
        
        comando.setAñosOtraExperienciaLaboral(r.getInteger("anhosOtraExperiencia"));
        comando.setMesesOtraExperienciaLaboral(r.getInteger("mesesOtraExperiencia"));
        
        comando.setSeguroPensiones(r.getEnum(SeguroPensiones.class,"cboSeguro"));//N
        
        comando.setFechaReferenciaSalud(r.getString("fechaReferenciaSalud"));
        comando.setTuvoProblemaSalud(r.getBoolean("presentaProblemaSalud"));
        comando.setOtroProblemaSalud(r.getString("otroProblemaSalud"));
        
        String[] valores = request.getParameterValues("problemaSalud");
        comando.setProblemaSalud(valores);
        /*
        comando.setProblemaGastrointestinal(StringUtil.StringtoBoolean(valores[0]));
        comando.setProblemaRespiratorio(StringUtil.StringtoBoolean(valores[1]));
        comando.setProblemaCirculatorio(StringUtil.StringtoBoolean(valores[2]));
        comando.setProblemaHormonal(StringUtil.StringtoBoolean(valores[3]));
        comando.setProblemaNeurologico(StringUtil.StringtoBoolean(valores[4]));
        comando.setProblemaGenitourinario(StringUtil.StringtoBoolean(valores[5]));
        comando.setProblemaIntervencionQuirurgica(StringUtil.StringtoBoolean(valores[6]));        
        comando.setProblemaAlergias(StringUtil.StringtoBoolean(valores[7]));
        */
        comando.setPracticaDeporte(r.getBoolean("practicaDeporte"));
        comando.setDeportePracticado(r.getString("deporte"));
    }

    public MiLoggerFile getLoggerErrores() {
        return loggerErrores;
    }

    public void setLoggerErrores(MiLoggerFile loggerErrores) {
        this.loggerErrores = loggerErrores;
    }
    
}
